/**
 * 文件名称: TCPClient.cs
 * 文件功能: 该文件实现了一个简单的 TCP 服务器，可监听指定端口，接收客户端连接和消息，并返回响应。
 * 用法说明: 
 * 1. 运行该程序后，服务器将启动并监听端口 8888。
 * 2. 客户端可连接到该服务器的 8888 端口并发送消息。
 * 3. 服务器接收到消息后，会将消息内容回显到控制台，并向客户端发送包含确认信息的响应。
 * 4. 每次处理完一个客户端的消息后，服务器会关闭与该客户端的连接，继续等待下一个客户端连接。
 * 
 * 注意事项: 
 * - 若指定端口已被其他程序占用，服务器将无法启动。
 * - 该实现仅支持处理 ASCII 编码的消息。
 */
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;

// 定义服务端监听的端口
int port = 8888;
// 创建一个 TcpListener 实例，监听本地所有 IP 地址的指定端口
TcpListener server = new TcpListener(IPAddress.Any, port);
try
{
    // 启动服务端监听
    server.Start();
    Console.WriteLine($"服务器已启动，监听端口 {port}...");

    while (true)
    {
        // 等待客户端连接
        Console.WriteLine("等待客户端连接...");
        TcpClient client = server.AcceptTcpClient();
        Console.WriteLine("客户端已连接。");

        // 获取与客户端的网络流
        NetworkStream stream = client.GetStream();

        // 读取客户端发送的数据
        byte[] buffer = new byte[1024];
        int bytesRead = stream.Read(buffer, 0, buffer.Length);
        string clientMessage = Encoding.ASCII.GetString(buffer, 0, bytesRead);
        Console.WriteLine($"接收到客户端消息: {clientMessage}");

        // 准备响应消息
        string responseMessage = "服务器已收到消息: " + clientMessage;
        byte[] responseBuffer = Encoding.ASCII.GetBytes(responseMessage);

        // 向客户端发送响应消息
        stream.Write(responseBuffer, 0, responseBuffer.Length);

        // 关闭客户端连接
        client.Close();
    }
}
catch (SocketException e)
{
    Console.WriteLine($"Socket 异常: {e}");
}
finally
{
    // 停止服务端监听
    server.Stop();
}